package intelligentCustomer.intent;

import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import intelligentCustomer.planning.ReasonGenerator;

import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

/**
 * 意图识别器
 * 分析用户查询，识别用户的意图类别
 */
public class IntentRecognizer {
    /** 大语言模型，用于复杂意图识别 */
    private final OpenAiStreamingChatModel model;
    
    /**
     * 构造函数
     * 
     * @param model 大语言模型实例
     */
    public IntentRecognizer(OpenAiStreamingChatModel model) {
        this.model = model;
    }
    
    /**
     * 识别用户查询的意图
     * 结合规则和模型的混合方法，支持异步输出推理过程
     * 
     * @param query 用户查询内容
     * @param callback 推理过程回调函数，可以为null
     * @return 识别出的意图对象
     */
    public Intent recognizeIntent(String query, Consumer<String> callback) {
        // 先尝试简单的规则匹配
        Intent ruleBasedIntent = recognizeIntentByRules(query);
        
        // 如果规则匹配的置信度高，直接返回
        if (ruleBasedIntent.getConfidence() > 0.8) {
            if (callback != null) {
                callback.accept("使用规则匹配识别意图: " + ruleBasedIntent.getCategory());
            }
            return ruleBasedIntent;
        }
        
        if (callback != null) {
            callback.accept("规则匹配置信度不足，启动深度推理...");
        }
        
        // 构建推理提示
        String prompt = "分析以下用户查询，识别用户意图类别：\n" +
                        "查询: " + query + "\n" +
                        "请从以下类别中选择一个最匹配的：\n" +
                        "- product_inquiry（产品咨询）\n" +
                        "- order_status（订单状态）\n" +
                        "- refund（退款/退货）\n" +
                        "- payment（支付问题）\n" +
                        "- general_inquiry（一般咨询）\n" +
                        "请详细解释你的推理过程，然后在最后一行只返回类别名称";
        
        // 使用同步API获取推理结果
        try {
            String response = ReasonGenerator.generate(model, prompt);
            return processResponse(response, callback);
        } catch (Exception e) {
            if (callback != null) {
                callback.accept("推理异常: " + e.getMessage());
            }
            return new Intent("general_inquiry", 0.7); // 出错时返回默认类别
        }
    }
    
    /**
     * 处理模型响应
     */
    private Intent processResponse(String response, Consumer<String> callback) {
        // 提取最后一行作为类别
        String[] lines = response.split("\n");
        String category = lines[lines.length - 1].trim();
        
        // 确保类别有效
        if (!isValidCategory(category)) {
            if (callback != null) {
                callback.accept("无效类别，使用默认类别: general_inquiry");
            }
            category = "general_inquiry";
        }
        
        if (callback != null) {
            callback.accept("最终识别意图: " + category);
        }
        
        return new Intent(category, 0.9);
    }

    /**
     * 识别用户查询的意图（无回调版本）
     * 
     * @param query 用户查询内容
     * @return 识别出的意图对象
     */
    public Intent recognizeIntent(String query) {
        return recognizeIntent(query, null);
    }

    /**
     * 验证类别是否有效
     */
    private boolean isValidCategory(String category) {
        return category.equals("product_inquiry") ||
               category.equals("order_status") ||
               category.equals("refund") ||
               category.equals("payment") ||
               category.equals("general_inquiry");
    }
    
    /**
     * 基于规则的意图识别
     */
    private Intent recognizeIntentByRules(String query) {
        if (query.contains("价格") || query.contains("多少钱") || query.contains("规格")) {
            return new Intent("product_inquiry", 0.9);
        } else if (query.contains("订单") || query.contains("物流") || query.contains("发货")) {
            return new Intent("order_status", 0.85);
        } else if (query.contains("退款") || query.contains("退货") || query.contains("换货")) {
            return new Intent("refund", 0.95);
        } else if (query.contains("支付") || query.contains("付款")) {
            return new Intent("payment", 0.9);
        } else {
            return new Intent("general_inquiry", 0.7);
        }
    }
}